カーネルをコンパイルする手順は以下のようです。
最新のカーネルソースは、http://www.kernel.orgから入手します。
取得したカーネルソースを/usr/src以下に展開します。
カーネルソースコードの場所は一般的には /usr/src/linux-バージョン、
Red HatやCentOSでは/usr/src/kernelsディレクトリ以下。
LinuCでは/usr/src/linuxとしている。
# cd /usr/src # wget ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.20.7.tar.gz # tar xzf /usr/src/linux-2.6.20.7.tar.gz # cd /usr/src/linux-2.6.20.7 |
ディレクトリ名 | 説明 |
arch | アーキテクチャに依存したコード |
configs | 目的別の.configファイル |
crypto | 暗号処理関数 |
drivers | 各種デバイスドライバ関連 |
fs | 仮想ファイルシステムと各種ファイルシステム関連 |
include | C言語のインクルードファイル |
init | 初期化コード |
ipc | SystemV互換プロセス間通信関連(共有メモリ、セマフォなど) |
kernel | 主要なカーネル機能 |
lib | 各種モジュール関連 |
mm | メモリ管理関連 |
net | 各種ネットワークプロトコル関連 |
scripts | カーネル作成支援スクリプト |
Documentation | 各種ドキュメント |
net | 各種ネットワークプロトコル関連 |
ファイル名 | 説明 |
.config | カーネルの設定ファイル |
Makefile | カーネルのMakefile |
カーネルのコンフィグレーションファイル.configを生成し、関連ファイルを設定します。
設定変更を目的として同一ディレクトリで作業をする場合は、.configファイルのバックアップをとっておきます。
$ mv /usr/src/linux-2.6.20.7/.config /usr/src/linux-2.6.20.7/.config.bak |
"make mrproper" でカーネルソースを初期化します。
現在のコンフィグレーションファイル.configと、前回のカーネルコンフィグレーションで生成されたすべてのファイルを削除して初期状態に戻します。
$ make mrproper |
現カーネルのコンフィグを新カーネルへ引き継ぎます。現カーネルのコンフィグ(.config)を引き継ぎ、新カーネルへ差分を取り出して設定するには "make oldconfig" します。
現在稼動中の設定を反映したい場合は、現在の.config を適宜持ってきてmake oldconfigを実行します。
※make oldconfig は現行の設定を引き継ぎつつ、追加になった設定のみを行う為のコマンドです。
$ cp /boot/config-2.6.18-194.26.1.el5 .config $ make oldconfig |
ここから先は対話形式で進みます。
"y"はカーネルに静的に組み込まれます。
"m"はカーネルモジュールとして組み込まれます。(使用時のみ動作します)
"n"は設定を無効化します。
"?"でヘルプを参照します。
さらに設定を変更する場合は、
make config、make menuconfig、make xconfig、make gconfig、make defconfigのコマンドを使用して設定を変更します。
config:設定項目1つ1つについて、順番に対話的に尋ねてくる、最もシンプルな形式です。
menuconfig:cursesライブラリを利用した、端末ベースのメニュー形式のインターフェイスです。
xconfig:QtベースのGUIツールです。
gconfig:GtkベースのGUIツールです。
defconfig:arch/$ARCH/defconfigをデフォルトとして、.configを生成します。
・カーネルの設定は/usr/src/linux/.configファイルに記録される
・make oldconfigで現在のコンフィグに新しい設定を反映する。
カーネルのバージョンアップ時以外は利用しない。
カーネルをコンパイルするには、make bzImage を実行します。
# make bzImage |
カーネルのコンパイルは、make zImage と make bzImage のどちらでもコンパイルできるが、zImageには、メモリ制限があるため大きなサイズのカーネルを作成するとエラーになってしまいます。そのため、最近ではbzImageを使います。
カーネルモジュールはカーネルにあったものが必要なので、カーネルモジュールもコンパイルします。
# make modules |
make をパラメータなしで実行するとカーネルとカーネルモジュールの両方のコンパイルが行われます。
5.カーネルとカーネルモジュールを配置するカーネルとカーネルモジュールと必要ファイルを適切なディレクトリにインストールします。
# make modules-install # make install |
make installで実行されること
・カーネルを/boot以下に、バージョンをファイル名に付加してコピーする
・初期RAMディスクが必要な場合は作成する>
・ブートローダーの設定ファイルに新しいカーネル用のエントリを追加する
make installが実行出来ない場合別途手作業での作業が必要となる。
[make installが実行できない場合]
・手作業でのカーネルのインストール
# cp /usr/src/linux/arch/x86/boot/bzImage /boot/vmlinuz-2.6.27 # cp /usr/src/linux/System.map /boot/System.map-2.6.27 # ln -s /boot/vmlinuz-2.6.27 /boot/vmlinuz # ln -s /boot/System.map-2.6.27 /boot/System.map |
System.mapファイルは、カーネルのメモリアドレスとシンボルとのマッピングが記述されている。シンボル一覧は/proc/ksyms , /proc/kallsymsで確認ができる
● カーネルイメージの配置
多くのディストリビューションでは、以下のコマンドでカーネルイメージとSystem.mapをインストール可能
# installkernel 2.6.18-6-686 arch/x86/boot/bzImage System.map |
システム起動時に必要な機能をカーネルモジュールとした場合は、初期RAMディスクが必要になります。
・ファイルとして用意されているファイルシステムをRAMディスクとしてメモリ上に展開して、それを暫定的なルートファイルとしてカーネルを起動します。この起動用のRAMディスクを初期RAMディスクといいます。
・初期RAMディスクで暫定的にカーネルを起動させ、その後実際のカーネルを起動させることができます。
・初期RAMディスクには、gzipで圧縮したファイルシステムイメージファイルであるinitrdと、gzipで圧縮しcpioアーカイブであるinitramfsがあり、それぞれmkinitrdコマンド、mkinitramfsコマンドで作成します。
# mkinitramfs -0 /boot/innitrd.img-2.6.27 2.6.27 |
初期RAMディスクを作成するコマンドは以下の2通り
1. mkinitrd RAMディスクイメージファイル名 カーネルバージョン
2. mkinitramfs -o RAMディスクイメージファイル名 カーネルバージョン
1. はファイルシステムイメージを圧縮
2.はcpioアーカイブを圧縮
という違いがある。mkinitramfsは-oオプションが必要なことに注意。
カーネル2.6.* では通常 2. mkinitramfs を利用する、とのこと。
展開して内容を確認する手順もメモ。
1.圧縮したイメージファイルを適当なディレクトリにコピーして、gunzipなどで解凍。
2.更に適当なディレクトリを作成して、移動する。
3.# cat RAMディスクイメージファイル名 | cpio -id で展開する。
・ブートローダの設定変更
-> 新しいカーネルで起動できるようにブートローダに新しいエントリを追加する
-> 新しいカーネルで問題が発生しないことを確認できるまでは前のエントリは残しておく
●GRUBの例
# vi /boot/grub/menu.lst |
title Linux-2.6.27 root (0,0) kernel /vmlinuz-2.6.27 root=/dev/sda1 ro initrd /initrd-2.6.27.img |
# vi/etc/lilo.conf |
image=/boot/vmlinuz-2.6.27 label=Linux-2.6.27 initrd /boot/initrd-2.6.27.img read-only root=/dev/sda1 ro |
clean | .config以外の不要なファイルを削除する |
mrproper | カーネルソースツリーを初期化する .configやバックアップファイルも含めて不要なファイルを削除する |
distclean | 上記に加えてpatchが作成したファイルも削除する |
defconfig | デフォルト値を設定した.configを作成する |
all | すべてのビルドを実施 |
modules | 動的なモジュールをすべてビルドする |
rpm | カーネルビルド後にRPMパッケージを作成する |
rpm-pkg | ソースRPMパッケージを作成する |
binrpm-pkg | ビルド済みカーネルとモジュールのRPMパッケージを作成 |
deb-pkg | ビルド済みカーネルとモジュールのDebianパッケージを作成 |
www.it-shikaku.jp